package com.example.controller;

import com.example.entity.RestBean;
import com.example.service.ImageService;
import com.example.utils.Const;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * 作者:xuSen
 * 日期:2025/4/25 12:45
 * 该控制器负责处理与图像上传相关的请求，包括用户头像上传和图片缓存上传。
 */
// 使用slf4j日志框架记录日志
// RestController注解表明这是一个Spring MVC的RESTful控制器
// RequestMapping注解用于映射请求到类或类中的具体方法
@Slf4j
@RestController
@RequestMapping("/api/image")
public class ImageController {

    // Resource注解用于自动装配ImageService接口的实例，该实例用于处理图像上传业务逻辑
    @Resource
    private ImageService imageService;

    /**
     * 上传用户头像的接口
     * 该方法接收一个multipart文件作为头像，并限制其大小不超过100KB
     * 如果文件大小超过限制，返回错误信息
     * 否则，调用ImageService的uploadAvatar方法上传头像
     * 如果上传成功，返回成功信息和头像的URL；如果上传失败，返回错误信息
     *
     * @param file 用户头像文件，通过@RequestParam注解从请求中获取
     * @param id 用户ID，用于确定头像所属的用户，通过@RequestAttribute从请求中获取
     * @return RestBean<String> 包含上传结果和头像URL的响应对象
     * @throws IOException 如果文件读写过程中发生错误
     */
    @PostMapping("/avatar")
    public RestBean<String> uploadAvatar(@RequestParam("file") MultipartFile file,
                                         @RequestAttribute(Const.ATTR_USER_ID) int id) throws IOException {
        // 检查文件大小是否超过100KB的限制
        if (file.getSize() > 1024 * 100) {
            // 文件大小超过限制，返回错误信息
            return RestBean.failure(400, "文件图片不能大于100kb");
        }
        // 记录上传头像的日志，方便后续排查问题
        log.info("上传头像");
        // 调用服务层方法uploadAvatar上传头像，返回上传后的头像URL
        String url = imageService.uploadAvatar(file, id);
        // 根据上传结果返回相应的响应
        if (url == null) {
            // 上传失败，记录日志并返回错误信息
            log.info("上传失败");
            return RestBean.failure(500, "上传失败");
        } else {
            // 上传成功，记录日志并返回成功信息和头像URL
            log.info("上传成功");
            return RestBean.success(url);
        }
    }

    /**
     * 上传图片到缓存的接口
     * 该方法接收一个multipart文件作为图片，并限制其大小不超过100MB
     * 如果文件大小超过限制，返回错误信息
     * 否则，调用ImageService的uploadImage方法上传图片
     * 如果上传成功，返回成功信息和图片的URL；如果上传失败，返回错误信息
     *
     * @param file 要上传的图片文件，通过@RequestParam注解从请求中获取
     * @param id 用户ID，用于确定图片所属的用户，通过@RequestAttribute从请求中获取
     * @param response HttpServletResponse对象，用于设置响应状态
     * @return RestBean<String> 包含上传结果和图片URL的响应对象
     * @throws IOException 如果文件读写过程中发生错误
     */
    @PostMapping("/cache")
    public RestBean<String> uploadImage(@RequestParam("file") MultipartFile file,
                                        @RequestAttribute(Const.ATTR_USER_ID) int id,
                                        HttpServletResponse response) throws IOException {
        // 检查文件大小是否超过100MB的限制
        if (file.getSize() > 1024 * 1024 * 100) {
            // 文件大小超过限制，返回错误信息
            return RestBean.failure(400, "文件图片不能大于100Mb");
        }
        // 记录上传图片的日志，方便后续排查问题
        log.info("上传图片");
        // 调用服务层方法uploadImage上传图片，返回上传后的图片URL
        String url = imageService.uploadImage(file, id);
        // 根据上传结果返回相应的响应
        if (url == null) {
            // 上传失败，设置响应状态为400，记录日志并返回错误信息
            response.setStatus(400);
            log.info("上传失败");
            return RestBean.failure(500, "上传失败");
        } else {
            // 上传成功，记录日志并返回成功信息和图片URL
            log.info("上传成功");
            return RestBean.success(url);
        }
    }
}